rm(list=ls())

Cz. 1 projektu - wykresy

Biblioteki

library(readr)
library(factoextra)
library(tidyverse)
library(kableExtra)
library(kableExtra)
library(ggpubr)
library(gridExtra)
library(hrbrthemes)
library(plotly)
library(ggrepel)

Wczytanie danych

df <- read.csv("C://Users//piotr//Desktop//pythonfiles//ekstraklasa_dane.csv")
df %>%
  kable(align = "c") %>%
  kable_styling(position="center") %>%
  scroll_box(height='500px',width="100%")
X nazwa_druzyny liczba_sezonow tytuly_ligowe liczba_meczy liczba_punktow bramki_strzelone bramki_stracone bilans_bramek liczba_zwyciestw liczba_remisow liczba_porazek
0 Legia Warszawa 87 15 2419 3514 4028 2546 1482 1195 596 628
1 Wisła Kraków 82 14 2231 2927 3585 2685 900 984 559 688
2 Górnik Zabrze 66 14 1933 2479 2875 2186 689 816 550 567
3 Ruch Chorzów 78 13 2086 2441 3129 2692 437 842 565 679
4 Lech Poznań 63 8 1837 2399 2573 2112 461 752 506 579
5 ŁKS Łódź 67 2 1774 1795 2276 2465 -189 606 484 684
6 Pogoń Szczecin 51 0 1534 1707 1843 2048 -205 518 433 583
7 Śląsk Wrocław 45 2 1390 1632 1650 1685 -35 497 412 481
8 Zagłębie Lubin 35 2 1110 1426 1393 1354 49 407 310 393
9 Widzew Łódź 37 4 1128 1425 1461 1318 143 442 348 338
10 Cracovia 45 4 1182 1352 1654 1658 -4 431 287 464
11 GKS Katowice 30 0 894 1030 1023 977 46 321 286 287
12 Lechia Gdańsk 31 0 879 1007 989 1152 -163 293 236 350
13 Polonia Warszawa 31 1 800 966 1165 1251 -86 304 178 318
14 Zagłębie Sosnowiec 36 0 987 918 1180 1330 -150 322 267 398
15 Polonia Bytom 35 2 889 879 1097 1139 -42 289 272 328
16 Jagiellonia Białystok 21 0 680 860 838 949 -111 239 185 256
17 Stal Mielec 29 2 853 857 965 1012 -47 279 262 312
18 Korona Kielce 16 0 521 676 615 700 -85 175 151 195
19 Piast Gliwice 14 1 465 656 566 555 11 177 125 163
20 Szombierki Bytom 25 1 702 645 875 999 -124 235 180 287
21 Wisła Płock 16 0 516 620 613 759 -146 168 124 224
22 Warta Poznań 22 2 527 572 966 864 102 217 98 212
23 Gwardia Warszawa 23 0 572 539 682 764 -82 195 149 228
24 Odra Wodzisław Śląski 14 0 418 529 487 570 -83 145 94 179
25 Odra Opole 22 0 564 523 645 740 -95 182 159 223
26 Arka Gdynia 16 0 508 510 522 667 -145 144 147 216
28 GKS Bełchatów 12 0 375 486 422 463 -41 130 96 149
29 Dyskobolia Grodzisk Wielkopolski 10 0 294 441 420 357 63 124 69 101
30 Raków Częstochowa 9 1 289 424 375 343 32 121 70 98
31 Zawisza Bydgoszcz 14 0 430 376 461 651 -190 126 98 206
32 Garbarnia Kraków 15 1 315 306 563 561 2 121 64 130
34 Stomil Olsztyn 8 0 254 296 255 339 -84 76 75 103
35 Górnik Łęczna 8 0 257 276 260 391 -131 70 66 121
36 Stal Rzeszów 11 0 290 255 297 377 -80 79 97 114
37 Hutnik Kraków 7 0 234 254 299 284 15 75 81 78
39 Podbeskidzie Bielsko-Biała 6 0 201 222 225 310 -85 54 60 87
41 Motor Lublin 9 0 274 220 259 372 -113 70 92 112
43 Bałtyk Gdynia 7 0 210 186 184 247 -56 64 61 85
44 ROW Rybnik 7 0 198 165 165 233 -78 50 65 83
45 Bruk-Bet Termalica Nieciecza 4 0 145 156 149 227 -78 39 39 67
46 Górnik Wałbrzych 6 0 180 154 190 243 -53 52 55 73
47 Zagłębie Wałbrzych 6 0 160 142 131 166 -35 50 42 68
48 Radomiak Radom 4 0 117 141 129 136 -7 37 38 42
50 Górnik Radlin 8 0 162 136 193 280 -87 50 36 76
51 Sokół Pniewy 4 0 136 130 128 190 -62 36 42 58
52 Polonia Bydgoszcz 7 0 156 129 186 296 -110 47 35 74
53 Ruch Radzionków 3 0 90 109 105 135 -30 30 19 41
54 Stal Stalowa Wola 4 0 132 103 113 173 -60 32 44 56
56 GKS Tychy 3 0 90 86 105 113 -8 28 30 32
58 KSZO Ostrowiec Świętokrzyski 3 0 92 71 73 147 -74 18 17 57
59 Siarka Tarnobrzeg 3 0 102 65 88 169 -81 19 24 59
60 Arkonia Szczecin 4 0 88 64 100 166 -66 20 24 44
61 Miedź Legnica 2 0 71 63 73 120 -47 14 21 36
62 Śląsk Świętochłowice 3 0 66 45 84 166 -82 19 7 40
63 Lechia/Olimpia Gdańsk 1 0 34 40 39 59 -20 11 7 16
64 Unia Racibórz 2 0 52 38 77 126 -49 14 10 28
66 Wawel Kraków 2 0 32 37 50 36 14 13 11 8
67 Igloopol Dębica 2 0 64 37 43 121 -78 9 19 36
69 Sandecja Nowy Sącz 1 0 37 33 34 54 -20 6 15 16
70 Szczakowianka Jaworzno 1 0 30 32 40 54 -14 8 8 14
71 RKS Radomsko 1 0 28 31 23 34 -11 7 10 11
73 Podgórze Kraków 2 0 42 27 56 103 -47 11 5 26
74 Górnik Polkowice 1 0 26 23 17 37 -20 6 5 15
75 Tarnovia Tarnów 1 0 26 22 42 48 -6 10 2 14
76 Świt Nowy Dwór Mazowiecki 1 0 26 22 21 42 -21 5 7 14
77 Puszcza Niepołomice 1 0 18 20 24 34 -10 5 5 8
79 GKS Jastrzębie-Zdrój 1 0 30 19 24 43 -19 8 8 14

Opis danych

Dane zostały zescrapowane ze strony https://pl.wikipedia.org/wiki/Tabela_wszech_czas%C3%B3w_Ekstraklasy_w_pi%C5%82ce_no%C5%BCnej z zastosowaniem biblioteki selenium w pythonie i przedstawiają one podsumowanie sezonów 1927 - 2022/2023 najwyższej klasy rozgrywkowej klubowej piłki nożnej w Polsce. Drużyny, które nie istnieją (zostały rozwiązanie) lub obecnie reprezentują regiony należące do innych krajów ze względu na zmianę granic po II WŚ zostały usunięte ze zbioru danych.

Opis zmiennych

  1. nazwa_druzyny - nazwa klubu piłkarskiego
  2. liczba_sezonow - liczba sezonów, jaką dany klub rozegrał w najwyższej klasie rozgrywkowej
  3. tytuly_ligowe - liczba tytułów ligowych, jaką danych klub zdobył w najwyższej klasie rozgrywkowej
  4. liczba_meczy - liczba meczy, jaką dany klub rozegrał w najwyższej klasie rozgrywkowej
  5. liczba_punktow - liczba punktów, jaką dany klub zdobył grając w najwyższej klasie rozgrywkowej
  6. bramki_strzelone - liczba strzelonych przez dany klub bramek w najwyższej klasie rozgrywkowej
  7. bramki_stracone - liczba straconych przez dany klub bramek w najwyższej klasie rozgrywkowej
  8. bilans_bramek - różnica między strzelonymi i straconymi bramkami przez dany klub w najwyższej klasie rozgrywkowej
  9. liczba_zwyciestw - liczba wygranych przez dany klub meczy w najwyższej klasie rozgrywkowej
  10. liczba_remisow - liczba zremisowanych przez dany klub meczy w najwyższej klasie rozgrywkowej
  11. liczba_porazek - liczba przegranych przez dany klub meczy w najwyższej klasie rozgrywkowej

Wykresy

Wykres 1 - Ranking polskich klubów piłkarskich według tytułów ligowych

Uzasadnienie: graficzna prezentacja najbardziej utytułowanych klubów w Polsce

Wszystkie z tych klubów obecnie występują w najwyższej lidze i posiadają długą historię występów

df %>%
  arrange(desc(tytuly_ligowe)) %>%
  head(10) %>%
  mutate(nazwa_druzyny = as.factor(nazwa_druzyny)) %>%
  mutate(nazwa_druzyny = fct_reorder(nazwa_druzyny,tytuly_ligowe)) %>%
  ggplot(aes(y=nazwa_druzyny,x=tytuly_ligowe,fill=tytuly_ligowe)) + 
  geom_bar(stat="identity") + 
  scale_fill_gradient(low="#1B4A9C",high="#A8B8D3")+
  geom_text(aes(label=tytuly_ligowe),hjust=-0.25)+
  labs(y="Klub piłkarski",x="Liczba tytułów ligowych",title="Ranking polskich klubów piłkarskich według tytułów ligowych") + 
  theme_pubclean(base_size = 14,base_family = "Times New Roman") + 
  guides(fill=FALSE)

Wykres 2 - Ranking polskich klubów piłkarskich według średniej liczby strzelonych bramek na mecz

Uzasadnienie: graficzna prezentacja klubów, które strzelały (lub strzelają jeśli dalej występują w ekstraklasie) najwięcej bramek w tej lidze

W rankingu znajdują się jedne z najbardziej zasłużonych dla polskiej piłki nożnej klubów, takie jak Legia Warszawa, Ruch Chorzów, Górnik Zabrze, Wisła Kraków. Nieoczywistym jest pozycja Warty Poznań, która w rankingu jest na pierwszym miejscu. Jest to klub, który od 1947 roku nie osiągnał żadnego sukcesu w skali kraju, choć według zaprezentowanych statystyk, jest najbardziej bramkostrzelnym w swojej historii występów w najwyższej klasie rozgrywkowej polskiej piłki klubowej

p <- df %>%
  mutate(sr_bramki_mecz = bramki_strzelone/liczba_meczy) %>%
  arrange(desc(sr_bramki_mecz)) %>%
  head(10) %>%
  mutate(nazwa_druzyny = fct_reorder(nazwa_druzyny,sr_bramki_mecz)) %>%
  ggplot(aes(x=sr_bramki_mecz,y=nazwa_druzyny,fill=sr_bramki_mecz,
             text = paste("Nazwa drużyny:",nazwa_druzyny,"\nŚrednia strzelonych bramek na mecz:",round(sr_bramki_mecz,2)))) + 
  scale_fill_gradient(low="#1B4A9C",high="#A8B8D3") +
  geom_bar(stat="identity",colour="white") + 
  labs(y="Średnia liczba strzelonych bramek na mecz",
       x="Klub piłkarski",
       title = "Ranking polskich klubów piłkarskich według średniej liczby strzelonych bramek na mecz")  + 
  theme_classic(base_family = "Times New Roman",base_size=12) + 
  guides(fill=guide_legend(title="Śr. strzelonych bramek/mecz"))

ggplotly(p,tooltip="text")

Wykres 3 - Zależność między liczbą strzelonych bramek a liczbą straconych bramek

Uzasadnienie: Zastosowano wykres rozrzutu z naniesionym trendem w celu graficznego zbadania zależności (korelacji) pomiędzy tymi zmiennymi

W danych występuje wyraźna pozytywna korelacja pomiędzy tymi zmiennymi - zespoły, które strzelają dużo bramek, również tracą dużo bramek

df %>%
  ggplot(aes(x=bramki_stracone,y=bramki_strzelone,fill=bramki_strzelone)) + 
  geom_point(shape=21,size=4,colour="black") + 
  geom_smooth(method="lm",se=T,color="black")+
  scale_fill_gradient(low="#1B4A9C",high="#A8B8D3") +
  scale_x_continuous(breaks=seq(0,3000,500))+
  scale_y_continuous(breaks=seq(0,4500,500))+
  theme_bw(base_size=14,base_family = "Times New Roman") +
  labs(x="Bramki stracone",y = "Bramki strzelone",title="Zależność liczby strzelonych bramek od liczby straconych bramek")

Cz. 2 projektu - PCA

Analiza głównych składowych (PCA) jest techniką stosowaną w celu zmniejszenia wymiarowości zbiorów danych przy jednoczesnym zachowaniu kluczowych informacji (przy możliwie jak najmniejszej utracie objaśnianej wariancji). Odbywa się to poprzez przekształcenie oryginalnych zmiennych w zestaw nowych, nieskorelowanych zmiennych. (źródło: https://www.analyticsvidhya.com/blog/2016/03/pca-practical-guide-principal-component-analysis-python/)

Selekcja zmiennych

W danych znajdują się zmienne które są ze sobą zbyt silnie powiązane (jedna zmienna wynika z drugiej), dlatego niektóre z nich w analizie PCA zdecydowano się usunać (były to bramki_stracone, bramki_strzelone,liczba_zwyciestw,liczba_porazek,liczba_remisow, liczba_meczy, bilans_bramek). Po usunięciu wymienionych zmiennych oraz stworzeniu nowej zmiennej bilans_meczy, objaśniana przez PCA1 i PCA2 wariancja spadła o niecały punkt procentowy.

df$bilans_meczy <- df$liczba_zwyciestw - df$liczba_porazek
df <- df %>%
  select(-c("X","bramki_stracone","bramki_strzelone","liczba_zwyciestw","liczba_porazek","liczba_remisow",
            "liczba_meczy","bilans_bramek")) %>%
  remove_rownames() %>%
  column_to_rownames("nazwa_druzyny") 
df %>%
  kable(align = "c") %>%
  kable_styling(position="center") %>%
  scroll_box(height='500px')
liczba_sezonow tytuly_ligowe liczba_punktow bilans_meczy
Legia Warszawa 87 15 3514 567
Wisła Kraków 82 14 2927 296
Górnik Zabrze 66 14 2479 249
Ruch Chorzów 78 13 2441 163
Lech Poznań 63 8 2399 173
ŁKS Łódź 67 2 1795 -78
Pogoń Szczecin 51 0 1707 -65
Śląsk Wrocław 45 2 1632 16
Zagłębie Lubin 35 2 1426 14
Widzew Łódź 37 4 1425 104
Cracovia 45 4 1352 -33
GKS Katowice 30 0 1030 34
Lechia Gdańsk 31 0 1007 -57
Polonia Warszawa 31 1 966 -14
Zagłębie Sosnowiec 36 0 918 -76
Polonia Bytom 35 2 879 -39
Jagiellonia Białystok 21 0 860 -17
Stal Mielec 29 2 857 -33
Korona Kielce 16 0 676 -20
Piast Gliwice 14 1 656 14
Szombierki Bytom 25 1 645 -52
Wisła Płock 16 0 620 -56
Warta Poznań 22 2 572 5
Gwardia Warszawa 23 0 539 -33
Odra Wodzisław Śląski 14 0 529 -34
Odra Opole 22 0 523 -41
Arka Gdynia 16 0 510 -72
GKS Bełchatów 12 0 486 -19
Dyskobolia Grodzisk Wielkopolski 10 0 441 23
Raków Częstochowa 9 1 424 23
Zawisza Bydgoszcz 14 0 376 -80
Garbarnia Kraków 15 1 306 -9
Stomil Olsztyn 8 0 296 -27
Górnik Łęczna 8 0 276 -51
Stal Rzeszów 11 0 255 -35
Hutnik Kraków 7 0 254 -3
Podbeskidzie Bielsko-Biała 6 0 222 -33
Motor Lublin 9 0 220 -42
Bałtyk Gdynia 7 0 186 -21
ROW Rybnik 7 0 165 -33
Bruk-Bet Termalica Nieciecza 4 0 156 -28
Górnik Wałbrzych 6 0 154 -21
Zagłębie Wałbrzych 6 0 142 -18
Radomiak Radom 4 0 141 -5
Górnik Radlin 8 0 136 -26
Sokół Pniewy 4 0 130 -22
Polonia Bydgoszcz 7 0 129 -27
Ruch Radzionków 3 0 109 -11
Stal Stalowa Wola 4 0 103 -24
GKS Tychy 3 0 86 -4
KSZO Ostrowiec Świętokrzyski 3 0 71 -39
Siarka Tarnobrzeg 3 0 65 -40
Arkonia Szczecin 4 0 64 -24
Miedź Legnica 2 0 63 -22
Śląsk Świętochłowice 3 0 45 -21
Lechia/Olimpia Gdańsk 1 0 40 -5
Unia Racibórz 2 0 38 -14
Wawel Kraków 2 0 37 5
Igloopol Dębica 2 0 37 -27
Sandecja Nowy Sącz 1 0 33 -10
Szczakowianka Jaworzno 1 0 32 -6
RKS Radomsko 1 0 31 -4
Podgórze Kraków 2 0 27 -15
Górnik Polkowice 1 0 23 -9
Tarnovia Tarnów 1 0 22 -4
Świt Nowy Dwór Mazowiecki 1 0 22 -9
Puszcza Niepołomice 1 0 20 -3
GKS Jastrzębie-Zdrój 1 0 19 -6

Test sferyczności Bartletta

Test ten służy do oceny, czy istnieje statystycznie istotna rozbieżność między macierzą korelacji a macierzą jednostkową - innymi słowy, czy wszystkie współczynniki korelacji są równe 0. Przed rozpoczęciem analizy PCA, należy upewnić się, że w oryginalnych danych istnieje statystycznie istotna korelacja. (źródła: https://www.analysisinn.com/post/kmo-and-bartlett-s-test-of-sphericity/,

https://easystats.github.io/performance/reference/check_factorstructure.html)

Hipotezy:

  • H0: Macierze te nie różnią się w sposób statystycznie istotny
  • Ha: Macierze te różnią się w sposób statystycznie istotny
bartlett.test(x = df %>% select_if(is.numeric), nrow(df))
## 
##  Bartlett test of homogeneity of variances
## 
## data:  df %>% select_if(is.numeric)
## Bartlett's K-squared = 1109.9, df = 3, p-value < 2.2e-16

P-value < 2.2e-16, należy zatem odrzucić hipotezę zerową, co pozwala na wykonanie analizy PCA

Analiza PCA

Skalowanie danych, eigenvalues oraz eigenvectors

pca <- prcomp(x = df %>% select_if(is.numeric), scale.=TRUE)

Eigenvalues - wartości własne

Aby obliczyć wartości własne, należy przyrównać wyznacznik macierzy |A-lambda| do 0, gdzie A to macierz kowariancji zeskalowanych danych. Z tej równości wyliczany jest parametr lambda, czyli eigenvalue. Wartości własnych (lambd) jest tyle, ile wynosi liczba zmiennych (źródło: https://www.geeksforgeeks.org/mathematical-approach-to-pca/). W zaprezentowanych danych, wartości własne są następujące:

sapply(pca$sdev, function(x) (x**2))
## [1] 3.482189476 0.435208310 0.074545192 0.008057022

Eigenvectors - wektory własne

W celu obliczenia wektorów własnych przyrównuje się do siebie iloczyny A*v oraz Lambda*v, gdzie A to macierz kowariancji zeskalowanych danych, lambda to wcześniej pozyskane wartości własne, a v to wektor niewadomych zmiennych. Po rozpisaniu tego równania w formie macierzowej, powstają układy równań zawierające po lewej i prawej stronie niewiadome zmienne z wektora v. Z tych równań wylicza się wektory własne. Następnie wektory są porządkowane w macierz i następuje przemnożenie zeskalowanych danych przez tę macierz, czego wynikiem są elementy głównych składowych (PCA) (źródło: https://www.geeksforgeeks.org/mathematical-approach-to-pca/).

eigen_vectors <- as.data.frame(pca$rotation)
eigen_vectors
##                       PC1        PC2         PC3        PC4
## liczba_sezonow -0.4990428 -0.5444471 -0.04153682  0.6729103
## tytuly_ligowe  -0.5153083  0.2456462  0.81013492 -0.1334043
## liczba_punktow -0.5167364 -0.3650210 -0.33312754 -0.6991203
## bilans_meczy   -0.4673297  0.7141393 -0.48060602  0.2015584

Suma kwadratów elementów wektorów wyznaczających poszczególne główne składowe musi się równać 1.

print(paste("Suma kwadratów elementów wektora PCA1 wynosi:",sum(sapply(eigen_vectors$PC1, function(x) x**2))))
## [1] "Suma kwadratów elementów wektora PCA1 wynosi: 1"
print(paste("Suma kwadratów elementów wektora PCA2 wynosi:",sum(sapply(eigen_vectors$PC2, function(x) x**2))))
## [1] "Suma kwadratów elementów wektora PCA2 wynosi: 1"
print(paste("Suma kwadratów elementów wektora PCA3 wynosi:",sum(sapply(eigen_vectors$PC3, function(x) x**2))))
## [1] "Suma kwadratów elementów wektora PCA3 wynosi: 1"
print(paste("Suma kwadratów elementów wektora PCA4 wynosi:",sum(sapply(eigen_vectors$PC4, function(x) x**2))))
## [1] "Suma kwadratów elementów wektora PCA4 wynosi: 1"

Macierz PCA

pca$x
##                                          PC1         PC2          PC3
## Legia Warszawa                   -8.36589607  2.10260356 -1.024757030
## Wisła Kraków                     -6.37520717  0.40034943  0.373078195
## Górnik Zabrze                    -5.47419690  0.66280735  0.835134378
## Ruch Chorzów                     -5.15353568 -0.33864787  1.027878003
## Lech Poznań                      -4.07991514 -0.22242914 -0.151952475
## ŁKS Łódź                         -1.63571867 -2.34983760 -0.041426799
## Pogoń Szczecin                   -0.97181247 -1.95009441 -0.508827247
## Śląsk Wrocław                    -1.48027882 -1.01245233 -0.403699731
## Zagłębie Lubin                   -1.10132297 -0.67791408 -0.285270473
## Widzew Łódź                      -1.88839867  0.09070213 -0.273010651
## Cracovia                         -1.35090561 -1.10504805  0.435562199
## GKS Katowice                     -0.51917674 -0.35674693 -0.675969271
## Lechia Gdańsk                    -0.07964323 -1.05440759 -0.208045083
## Polonia Warszawa                 -0.41308837 -0.64073137 -0.172367956
## Zagłębie Sosnowiec               -0.04201808 -1.28087052 -0.083136898
## Polonia Bytom                    -0.47387026 -0.81667301  0.219177748
## Jagiellonia Białystok             0.05333063 -0.43243099 -0.327395850
## Stal Mielec                      -0.35004569 -0.61003397  0.209902415
## Korona Kielce                     0.30698240 -0.24179153 -0.223038395
## Piast Gliwice                     0.04985877  0.14473094 -0.147116095
## Szombierki Bytom                  0.12757007 -0.62280333  0.170052320
## Wisła Płock                       0.52146631 -0.48559442 -0.016878909
## Warta Poznań                     -0.18392962 -0.01324976  0.154582920
## Gwardia Warszawa                  0.30114381 -0.45083288 -0.111535520
## Odra Wodzisław Śląski             0.52059141 -0.22687051 -0.084858549
## Odra Opole                        0.37428399 -0.47813367 -0.062262426
## Arka Gdynia                       0.67389618 -0.55361340  0.111560900
## GKS Bełchatów                     0.52191133 -0.04346272 -0.138223015
## Dyskobolia Grodzisk Wielkopolski  0.39188928  0.34365075 -0.327175639
## Raków Częstochowa                 0.27674464  0.44823426 -0.082642931
## Zawisza Bydgoszcz                 0.84929779 -0.49979636  0.213794877
## Garbarnia Kraków                  0.37462003  0.11269907  0.118586435
## Stomil Olsztyn                    0.78106820  0.08728016 -0.007923226
## Górnik Łęczna                     0.91242801 -0.08347012  0.122019192
## Stal Rzeszów                      0.77861541 -0.02894203  0.044475277
## Hutnik Kraków                     0.71439768  0.31260744 -0.109126612
## Podbeskidzie Bielsko-Biała        0.90638552  0.12767969  0.058251121
## Motor Lublin                      0.88268063 -0.01453585  0.098834656
## Bałtyk Gdynia                     0.84847688  0.20966373  0.011254454
## ROW Rybnik                        0.92153702  0.12950197  0.080983526
## Bruk-Bet Termalica Nieciecza      0.97227901  0.24689270  0.065373147
## Górnik Wałbrzych                  0.89303823  0.25002243  0.027017492
## Zagłębie Wałbrzych                0.88634676  0.27823839  0.017046419
## Radomiak Radom                    0.86931601  0.42672146 -0.044376789
## Górnik Radlin                     0.88350294  0.17062067  0.056228244
## Sokół Pniewy                      0.96023792  0.30427252  0.046296068
## Polonia Bydgoszcz                 0.91620524  0.19162123  0.066231778
## Ruch Radzionków                   0.94336266  0.42202286  0.001709188
## Stal Stalowa Wola                 0.98818149  0.30204990  0.068082108
## GKS Tychy                         0.92439456  0.48549040 -0.023719313
## KSZO Ostrowiec Świętokrzyski      1.10645609  0.22976537  0.159652493
## Siarka Tarnobrzeg                 1.11539589  0.22509948  0.167301515
## Arkonia Szczecin                  1.01434780  0.32053370  0.084950898
## Miedź Legnica                     1.05137343  0.38641173  0.079119744
## Śląsk Świętochłowice              1.03544440  0.37725977  0.079929537
## Lechia/Olimpia Gdańsk             1.00635473  0.55016725  0.005074991
## Unia Racibórz                     1.02883297  0.45833670  0.049502486
## Wawel Kraków                      0.93613380  0.60149206 -0.046087621
## Igloopol Dębica                   1.09338871  0.36118652  0.115634720
## Sandecja Nowy Sącz                1.03562233  0.51593711  0.033371838
## Szczakowianka Jaworzno            1.01663639  0.54644925  0.013589079
## RKS Radomsko                      1.00747889  0.56194229  0.003913966
## Podgórze Kraków                   1.04112743  0.45604054  0.059314173
## Górnik Polkowice                  1.03741742  0.52818610  0.032643346
## Tarnovia Tarnów                   1.01351727  0.56620778  0.007806763
## Świt Nowy Dwór Mazowiecki         1.03808835  0.52866004  0.033075879
## Puszcza Niepołomice               1.00994492  0.57466521  0.003618006
## GKS Jastrzębie-Zdrój              1.02535850  0.55261051  0.019212009
##                                           PC4
## Legia Warszawa                    0.161137165
## Wisła Kraków                      0.002653560
## Górnik Zabrze                    -0.188483094
## Ruch Chorzów                      0.076114920
## Lech Poznań                      -0.137917252
## ŁKS Łódź                          0.235349462
## Pogoń Szczecin                   -0.077924107
## Śląsk Wrocław                    -0.102464588
## Zagłębie Lubin                   -0.231076558
## Widzew Łódź                      -0.054620579
## Cracovia                         -0.029632339
## GKS Katowice                      0.092573552
## Lechia Gdańsk                    -0.048285486
## Polonia Warszawa                  0.041330216
## Zagłębie Sosnowiec                0.147916442
## Polonia Bytom                     0.153123299
## Jagiellonia Białystok            -0.141435376
## Stal Mielec                      -0.001009766
## Korona Kielce                    -0.136453533
## Piast Gliwice                    -0.147249181
## Szombierki Bytom                  0.065353307
## Wisła Płock                      -0.161921878
## Warta Poznań                      0.120279390
## Gwardia Warszawa                  0.178310208
## Odra Wodzisław Śląski            -0.094962289
## Odra Opole                        0.144741380
## Arka Gdynia                      -0.095982518
## GKS Bełchatów                    -0.086410583
## Dyskobolia Grodzisk Wielkopolski -0.018817130
## Raków Częstochowa                -0.073261996
## Zawisza Bydgoszcz                -0.053574924
## Garbarnia Kraków                  0.152847666
## Stomil Olsztyn                   -0.055443058
## Górnik Łęczna                    -0.088156087
## Stal Rzeszów                      0.058228414
## Hutnik Kraków                     0.002413043
## Podbeskidzie Bielsko-Biała       -0.063260785
## Motor Lublin                      0.012889398
## Bałtyk Gdynia                     0.025988407
## ROW Rybnik                        0.019617014
## Bruk-Bet Termalica Nieciecza     -0.055026012
## Górnik Wałbrzych                  0.023899326
## Zagłębie Wałbrzych                0.041150661
## Radomiak Radom                    0.007338370
## Górnik Radlin                     0.091914579
## Sokół Pniewy                     -0.018707864
## Polonia Bydgoszcz                 0.065012546
## Ruch Radzionków                  -0.007467660
## Stal Stalowa Wola                 0.001562090
## GKS Tychy                         0.028246764
## KSZO Ostrowiec Świętokrzyski     -0.032319364
## Siarka Tarnobrzeg                -0.028992425
## Arkonia Szczecin                  0.036963888
## Miedź Legnica                    -0.020162810
## Śląsk Świętochłowice              0.029432683
## Lechia/Olimpia Gdańsk             0.005609820
## Unia Racibórz                     0.019486582
## Wawel Kraków                      0.060664660
## Igloopol Dębica                  -0.007159069
## Sandecja Nowy Sącz                0.001366531
## Szczakowianka Jaworzno            0.010752235
## RKS Radomsko                      0.015898957
## Podgórze Kraków                   0.027352213
## Górnik Polkowice                  0.012563406
## Tarnovia Tarnów                   0.024068603
## Świt Nowy Dwór Mazowiecki         0.013471145
## Puszcza Niepołomice               0.028003571
## GKS Jastrzębie-Zdrój              0.022552835

Wariancja

PCA1 i PCA2 wyjaśniają ~97.94% wariancji

summary(pca)
## Importance of components:
##                           PC1    PC2     PC3     PC4
## Standard deviation     1.8661 0.6597 0.27303 0.08976
## Proportion of Variance 0.8706 0.1088 0.01864 0.00201
## Cumulative Proportion  0.8706 0.9794 0.99799 1.00000
Ilustruje to również Scree plot
fviz_eig(pca,addlabels = TRUE)

Kontrybucja zmiennych

Zaznaczona na wykresach linia referencyjna wskazuje na spodziewaną kontrybucję, gdyby wszystkie zmienne miały taki sam wpływ na dany wymiar (źródło: http://www.sthda.com/english/wiki/fviz-contrib-quick-visualization-of-row-column-contributions-r-software-and-data-mining)

Dla PCA1 zmienne liczba_punktow oraz tytuly_ligowe są najważniejsze w kontrybucji do tego wymiaru, ponieważ przekraczają linie referencyjną

fviz_contrib(pca,choice="var")

Dla PCA2, zmienne bilans_meczy oraz liczba_sezonow mają największy wpływ na ten wymiar, ponieważ przekraczają linie referencyjną

fviz_contrib(pca,choice="var",axes=2)

Wykresy PCA

  fviz_pca_var(pca, 
             repel = TRUE,
             col.circle = "red",
             col.var="blue")

fviz_pca_biplot(pca,label="var",repel = TRUE)

ggplot(data.frame(pca$x,sample=rownames(df)),aes(x=PC1,y=PC2)) + geom_point() + 
geom_text_repel(aes(label=rownames(df)),box.padding = 0.01,
                hjust=1.5,vjust=-2) +
   xlim(-10, 4) + ylim (-2.5,2.25)

Wnioski (na podstawie wykresów i eigenvectors)

  1. Zmienne liczba_sezonów, liczba_punktów są ze sobą pozytywnie skorelowane
  2. Pary zmiennych liczba_sezonów, tytuły ligowe oraz liczba punktów, tytuły ligowe są ze sobą pozytywnie skorelowane
  3. Zmienne liczba_sezonow, bilans_meczy są ze sobą nisko pozytywnie skorelowane
  4. Wszystkie wektory są podobnej długości, co wskazuje na podobną zmienność cech
  5. Zmienne liczba_punktow, tytuly_ligowe są wyraźnie bardziej (pozytywnie) skorelowane z PCA1 niż PCA2, w przypadku pozostałych zmiennych te korelacje wydają się byc podobne zarówno z PCA1 jak i PCA2
  6. Ze względu na to, że wszystkie elementy wektora PC1 są ujemne, kluby piłkarskie, które znajdują się po ujemnej stronie osi X, cechują się wysokimi wartościami uwzględnionych zmiennych. Są to zatem przede wszystkim kluby, które (w porównaniu do reszty klubów) rozegrały więcej sezonów, co wiąże się z wysokimi pozostałymi statystykami. Kluby, które jednocześnie znajdują się po negatywnej stronie osi X i pozytywnej stronie osi Y powinny być najbardziej zasłużone dla polskiej piłki nożnej, ponieważ ponadto posiadają więcej (w porównaniu z innymi klubami) tytułów ligowych oraz ich bilans meczy jest wyraźnie wyższy (w porównaniu z innymi klubami).
  7. Po dodatniej stronie osi X powinny znajdować się przede wszystkim kluby z relatywnie krótką historią w najwyższej klasie rozgrywkowej, które jednocześnie wykazują się ujemnym bilansem meczy (tzn. kluby te przegrały wyraźnie więcej meczy niż wygrały).